package model;

import java.awt.Color;
import java.util.Objects;
/*
 *             activerEffet(): qui va lancer l'effet de la carte selon son type, certains type auront des effets qui se dérouleront à un certains moment
 */

/**
 * Classe Carte va représenté une carte du jeu. Elle sera utilisé pour les
 * différents type de cartes : Offensives et Défensives.
 *
 * @author Antoine Thorr, Joana Santos, Samy Rida, Vicky Ngo Pagbe
 */
public abstract class Carte { //pourquoi on ferait pas en sorte que Carte implémente ObjetAttaquable

    private int cout;
    private String nom;
    private Type type;
    private boolean selection;
    private int id;
    private static int compteur = 0;
    private Color c;

    /**
     * Constructeur de la classe Carte, permet de créer une carte générique avec
     * un coût, un nom et un type de carte.
     *
     * @param cout
     * @param nom
     * @param type
     */
    public Carte(int cout, String nom, Type type) {
        this.cout = cout;
        this.nom = nom;
        this.type = type;
        this.selection = false;
        this.id = compteur++;
    }

    /**
     * Retourne la couleur de la carte.
     *
     * @return la couleur de la carte
     */
    public Color getC() {
        return c;
    }

    /**
     * Affecte une couleur à la carte courante
     *
     * @param c : nouvelle couleur à affectée.
     */
    public void setC(Color c) {
        this.c = c;
    }

    /**
     * Retourne l'identifiant de la carte
     *
     * @return l'identifiant de la carte
     */
    public int getId() {
        return id;
    }

    /**
     * Retourne si la carte est selectionné ou non. Elle sert à annoncer au
     * controleur si il doit afficher la carte sur l'écran de séléction.
     *
     * @return True si elle est selectionnée, false sinon.
     */
    public boolean isSelection() {
        return this.selection;
    }

    /**
     * Permet de définir si la Carte doit être affiché ou non.
     *
     * @param selection
     */
    public void setSelection(boolean selection) {
        this.selection = selection;
    }

    /**
     * Permet d'activer l'effet de la carte A implémenter
     */
    public void activerEffet() {
        // TODO - implement Carte.activerEffet
        throw new UnsupportedOperationException();
    }

    /**
     * Retourne le coût d'une carte.
     *
     * @return Le coût d'une carte.
     */
    public int getCout() {
        return this.cout;
    }

    /**
     * Permet de définir le coût d'une carte.
     *
     * @param cout : Nouveau coût d'une carte
     */
    public void setCout(int cout) {
        this.cout = cout;
    }

    /**
     * Retourne le nom de la Carte.
     *
     * @return le nom de la carte.
     */
    public String getNom() {
        return this.nom;
    }

    /**
     * Permet de définir le nom de la carte.
     *
     * @param nom : Nouveau nom de la Carte.
     */
    public void setNom(String nom) {
        this.nom = nom;
    }

    /**
     * Retourne le Type de la carte.
     *
     * @return le type de la carte.
     */
    public Type getType() {
        return this.type;
    }

    /**
     * Permet de définir le type d'une carte
     *
     * @param type : Nouveau Type
     */
    public void setType(Type type) {
        this.type = type;
    }

    /**
     * Méthode abstraite qui permettra aux classes filles de récupérer
     * l'attitude de la Carte. Elle va retourner un String pour dire si une
     * carte est offensive ou défensive
     *
     * @return String L'attitude de la carte
     */
    public abstract String getAttitude();

    /**
     * Méthode abstraite qui permettra aux classes filles de rédéfinir la
     * méthode toString
     *
     * @return Affichage de la Carte
     */
    @Override
    public abstract String toString();

    /**
     * Permet de savoir si l'objet passé en paramètre est identique à l'objet
     * actuel.
     *
     * @param obj : Objet à comparer
     * @return True si les deux objets sont identiques, faux sinon.
     */
    @Override
    public boolean equals(Object obj) {
        Carte c = (Carte) obj;
        return this.getId() == c.getId();
    }
}
